package grame

import grails.converters.JSON
import grails.util.Environment
import org.apache.shiro.grails.ShiroSecurityService

import static ControllerPermission.ANY_ACTION
import static ControllerPermission.ANY_CONTROLLER
import static ControllerPermission.ANY_NAMESPACE
import static ResourcePermission.ANY_RESOURCE
import static ResourcePermission.ANY_RESOURCE_ID

class GrameInit {

    static init(ShiroSecurityService shiroSecurityService) {
        // init json date format
        JSON.registerObjectMarshaller(Date) { date ->
            return date?.format("yyyy-MM-dd HH:mm:ss")
        }

        /* 系统默认角色 */
        Role.withTransaction {
            // 系统（系统自身）角色，系统角色无需创建
            // 任何人（所有用户拥有该角色）角色
            Role.findOrCreateByName(SystemRoleName.Anyone.name())
                    .addToPermissions(ControllerPermission.toPermission('auth', ANY_ACTION))
                    .addToPermissions(ControllerPermission.toPermission('assets', ANY_ACTION))
                    .save();
            // 系统管理员（系统运维）角色
            Role.findOrCreateByName(SystemRoleName.SystemManager.name())
                    .addToPermissions(ControllerPermission.toPermission(ANY_NAMESPACE, ANY_CONTROLLER, ANY_ACTION))
                    .save()
            // 管理员（业务）角色
            Role.findOrCreateByName(SystemRoleName.Administrator.name())
                    .save()
            // 用户（业务）角色
            Role.findOrCreateByName(SystemRoleName.User.name())
                    .save()
        }

        User.withTransaction {
            /* 系统默认用户 */

            // 系统用户（代表系统自身），系统用户无需创建
            // 匿名用户（代表未登录系统的用户）
            User.findOrCreateByUsername(SystemUserName.Anonymous.name())
                    .setPasswordHash(shiroSecurityService.encodePassword(SystemUserName.Anonymous.password))
                    .save()
            // 系统管理员（系统运维人员）
            User.findOrCreateByUsername('admin')
                    .setPasswordHash(shiroSecurityService.encodePassword('admin'.encodeAsSHA1()))
                    .addToRoles(Role.findByName(SystemRoleName.SystemManager.name()))
                    .addToPermissions(ResourcePermission.toPermission(ANY_RESOURCE, ANY_RESOURCE_ID))
                    .save()
        }

        if (Environment.current == Environment.DEVELOPMENT) {
            if (!User.findByUsername('dev'))
                User.findOrCreateByUsername('dev')
                        .setPasswordHash(shiroSecurityService.encodePassword('password'.encodeAsSHA1()))
                        .addToPermissions("*") // ALL_PERMISSIONS
                        .save(flush: true)
        }
    }
}
